#ifndef LBCUDA_HEADER	
#define LBCUDA_HEADER


#include <Windows.h>
#include <GL/glew.h>
#include <cuda_gl_interop.h>

class CudaLB {
public:

	CudaLB( int numCellsU, int numCellsV);

	void Update();

	void UpdateParts( );

	void GetGrid( float * out);

	void SetGrid( float * in);

	bool IsAllocated() { return isAllocated; }

	void SetNumParts( int num, int dim, float * parts );

	int GetNumParts();

	GLuint GetPartsVBO();

private:
	
	void AllocateMemory();

	void AllocateConstants();

	float * lbGrid [2];
	int currNdx;
	int mNumCells[2];
	int mNumParts;

	bool isAllocated;

	GLuint mPartsVBO;
};

void InitCudaGLDevice();

GLuint GenerateCUDAGLVbo( int numVerts, int numDims, float * data );

void RegisterCudaVBO( GLuint vbo );

void MapCudaVBO ( GLuint vbo, float ** mappedPtr );

void RenderVBO( GLuint vbo, int numDims, int numPoints, float * color );

void UnmapCudaVBO( GLuint vbo );

void DeleteCUDAGLVBO( GLuint vbo );

//// Create an opengl texture
//void CreateEmptyTexture(int resU, int resV, GLuint & tex) {
//	glGenTextures(1, &tex);
//	glBindTexture(GL_TEXTURE_2D, tex);
//
//	// Set Params
//	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
//	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
//	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
//	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
//
//	//Create the texture data
//	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
// 
//}

#endif